home *** CD-ROM | disk | FTP | other *** search
/ Aminet 46 / Aminet 46 (2001)(GTI - Schatztruhe)[!][Dec 2001].iso / Aminet / text / edit / edt10src.lha / txt / EClip.mod < prev    next >
Text File  |  1995-04-08  |  6KB  |  261 lines

  1. (*
  2.   .name       EClip
  3.   .task       clipboard management
  4.   .release    1.0
  5.   .language   Oberon-2
  6.   .translator Amiga Oberon 3.11
  7.   .system     AmigaOS 2.04/2.1/3.0
  8.   .author     Joachim Barheine
  9.   .address    Hochgrevestraße 3, D-38640 Goslar
  10.   .copyright  (c) 1994 by Joachim Barheine
  11. *)
  12.  
  13. (* .info: 19/08/94, 01:09:17, version 21 *)
  14.  
  15. MODULE EClip;
  16.  
  17. IMPORT
  18.   SYS:= SYSTEM,
  19.  
  20.   Dos,
  21.   EIcon,
  22.   Err:= ErrCodes,
  23.   Exec,
  24.   F:= Files,
  25.   GUI,
  26.   IFF:= IFFParse,
  27.   IO:= IOServer,
  28.   K:= Kernel,
  29.   Sett:= Settings,
  30.   Str:= StrPool,
  31.   T:= Texts,
  32.   Req:= ERequests,
  33.   W:= Windows;
  34.  
  35. CONST
  36.   idFTXT= SYS.VAL(LONGINT, "FTXT");
  37.   idCHRS= SYS.VAL(LONGINT, "CHRS");
  38.  
  39. VAR
  40.   iff: IFF.IFFHandlePtr;
  41.  
  42. PROCEDURE CloseClip;
  43.  
  44. BEGIN
  45.   IFF.CloseIFF(iff);
  46.   IFF.CloseClipboard(SYS.VAL(IFF.ClipboardHandlePtr, iff.stream));
  47. END CloseClip;
  48.  
  49. PROCEDURE OpenClip(id: INTEGER; mode: LONGSET): BOOLEAN;
  50.  
  51. BEGIN
  52.   iff.stream:= SYS.VAL(LONGINT, IFF.OpenClipboard(id));
  53.   IF iff.stream # NIL THEN
  54.     IFF.InitIFFasClip(iff);
  55.     IF IFF.OpenIFF(iff, mode) = 0 THEN
  56.       RETURN TRUE;
  57.     ELSE
  58.       IFF.CloseClipboard(SYS.VAL(IFF.ClipboardHandlePtr, iff.stream));
  59.     END;
  60.   END;
  61.   RETURN FALSE;
  62. END OpenClip;
  63.  
  64. PROCEDURE WriteClip(id: INTEGER; t: T.Text; pos, len: LONGINT): BOOLEAN;
  65.  
  66. VAR
  67.   done: BOOLEAN;
  68.  
  69.   PROCEDURE WriteData(): BOOLEAN;
  70.  
  71.   CONST
  72.     blkSize= 4096;
  73.  
  74.   VAR
  75.     i, p, l: LONGINT;
  76.     block: K.DynString;
  77.     done: BOOLEAN;
  78.  
  79.   BEGIN
  80.     done:= TRUE;
  81.     block:= NIL;
  82.     p:= pos;
  83.     FOR i:= 1 TO len DIV blkSize DO
  84.       l:= t.ReadContents(block, p, blkSize);
  85.       done:= done & (IFF.WriteChunkBytes(iff, block^, l) = l);
  86.       INC(p, blkSize);
  87.     END;
  88.     l:= t.ReadContents(block, p, len MOD blkSize);
  89.     done:= done & (IFF.WriteChunkBytes(iff, block^, l) = l);
  90.     DISPOSE(block);
  91.     RETURN done;  (* done? *)
  92.   END WriteData;
  93.  
  94. BEGIN
  95.   done:= FALSE;
  96.   IF OpenClip(id, IFF.write) THEN
  97.     IF IFF.PushChunk(iff, idFTXT, IFF.idFORM, IFF.sizeUnknown) = 0 THEN
  98.       IF IFF.PushChunk(iff, 0, idCHRS, IFF.sizeUnknown) = 0 THEN
  99.         done:= WriteData();
  100.         done:= (IFF.PopChunk(iff) = 0) & done;
  101.       END;
  102.       done:= (IFF.PopChunk(iff) = 0) & done;
  103.     END;
  104.     CloseClip;
  105.   END;
  106.   RETURN done;
  107. END WriteClip;
  108.  
  109. PROCEDURE ReadClip(id: INTEGER; t: T.Text; pos: LONGINT): BOOLEAN;
  110.  
  111. VAR
  112.   done: BOOLEAN;
  113.  
  114.   PROCEDURE ReadData(): BOOLEAN;
  115.  
  116.   CONST
  117.     blkSize= 4096;
  118.  
  119.   VAR
  120.     len, err: LONGINT;
  121.     block: UNTRACED POINTER TO ARRAY blkSize OF CHAR;
  122.     off: BOOLEAN;
  123.  
  124.   BEGIN
  125.     NEW(block);
  126.     off:= FALSE;
  127.     t.LinkChanges;
  128.     LOOP
  129.       err:= IFF.ParseIFF(iff, IFF.parseScan);  (* new context *)
  130.       IF err = 0 THEN
  131.         REPEAT
  132.           len:= IFF.ReadChunkBytes(iff, block^, blkSize);
  133.           IF (len = blkSize) & ~off THEN IO.DisplayOff(t); off:= TRUE END;
  134.           t.Insert(pos, block^, len); INC(pos, len);
  135.         UNTIL len <= 0;
  136.       ELSIF err # IFF.errEOC THEN  (* end of file or error *)
  137.         EXIT;
  138.       END;
  139.     END;
  140.     DISPOSE(block);
  141.     t.LinkChangesDone;
  142.     IF off THEN IO.DisplayOn(t) END;
  143.     RETURN err = IFF.errEOF;
  144.   END ReadData;
  145.  
  146. BEGIN
  147.   done:= FALSE;
  148.   IF OpenClip(id, IFF.read) THEN
  149.     done:= (IFF.StopChunk(iff, idFTXT, idCHRS) = 0) & ReadData();
  150.     CloseClip;
  151.   END;
  152.   RETURN done;
  153. END ReadClip;
  154.  
  155. (* -- edit -- *)
  156.  
  157. (* clipboard: copy; 'pos' and 'len' may not be the same variable! *)
  158. PROCEDURE ClipCopy(w: W.Window; id: INTEGER; VAR pos, len: LONGINT): BOOLEAN;
  159.  
  160. BEGIN
  161.   IF W.markDef IN w.flags THEN
  162.     pos:= w.markBegin;
  163.     len:= w.markEnd - pos + 1;
  164.     RETURN WriteClip(id, w.text(T.Text), pos, len);
  165.   ELSE
  166.     RETURN FALSE;
  167.   END;
  168. END ClipCopy;
  169.  
  170. (* clipboard: copy *)
  171. PROCEDURE Copy* (w: W.Window; id: INTEGER);
  172.  
  173. VAR
  174.   dummy0, dummy1: LONGINT;  (* ignore them *)
  175.  
  176. BEGIN
  177.   IO.Busy(w.text, Str.copying^);
  178.   IF ~ClipCopy(w, id, dummy0, dummy1) THEN
  179.     Req.ReqMessage(w.win, Str.cannotCopyClip^, Str.cancel^);
  180.   END;
  181.   IO.BusyDone(w.text);
  182. END Copy;
  183.  
  184. (* clipboard: cut *)
  185. PROCEDURE Cut* (w: W.Window; id: INTEGER);
  186.  
  187. VAR
  188.   pos, len: LONGINT;
  189.  
  190. BEGIN
  191.   IF W.markDef IN w.flags THEN
  192.     IO.Busy(w.text, Str.cutting^);
  193.     IF ClipCopy(w, id, pos, len) THEN
  194.       w.text(T.Text).Delete(pos, len);
  195.     ELSE
  196.       Req.ReqMessage(w.win, Str.cannotCopyClip^, Str.cancel^);
  197.     END;
  198.     IO.BusyDone(w.text);
  199.   ELSE
  200.     GUI.Flash;
  201.   END;
  202. END Cut;
  203.  
  204. PROCEDURE Paste* (w: W.Window; id: INTEGER);
  205.  
  206. BEGIN
  207.   IO.Busy(w.text, Str.pasting^);
  208.   IF ~ReadClip(id, w.text(T.Text), w.pos) THEN
  209.     Req.ReqMessage(w.win, Str.cannotReadClip^, Str.cancel^);
  210.   END;
  211.   IO.BusyDone(w.text);
  212. END Paste;
  213.  
  214. PROCEDURE Save* (w: W.Window; filename: ARRAY OF CHAR);
  215.  
  216. CONST
  217.   blkSize= 4096;
  218.  
  219. VAR
  220.   t: T.Text;
  221.   f: F.File;
  222.   done: BOOLEAN;
  223.   i, p, len, l: LONGINT;
  224.   block: K.DynString;
  225.  
  226. (* $CopyArrays- *)
  227.  
  228. BEGIN
  229.   t:= w.text(T.Text);
  230.   IF f.Open(filename, TRUE) THEN
  231.     done:= TRUE;
  232.     block:= NIL;
  233.     p:= w.markBegin;
  234.     len:= w.markEnd - w.markBegin + 1;
  235.     FOR i:= 1 TO len DIV blkSize DO
  236.       l:= t.ReadContents(block, p, blkSize);
  237.       f.Write(block^, l);
  238.       INC(p, blkSize);
  239.       done:= done & f.done;
  240.     END;
  241.     l:= t.ReadContents(block, p, len MOD blkSize);
  242.     f.Write(block^, l);
  243.     done:= done & f.done;
  244.     f.Close;
  245.     DISPOSE(block);
  246.     IF ~done THEN
  247.       IF Dos.DeleteFile(filename) THEN END;
  248.       Req.ReqMessage(w.win, Str.cannotSaveClip^, Str.cancel^);
  249.     ELSIF Sett.icons THEN
  250.       EIcon.PutIcon(filename, NIL);
  251.     END;
  252.   END;
  253. END Save;
  254.  
  255. BEGIN
  256.   iff:= IFF.AllocIFF();
  257.   K.Assert(iff # NIL, Err.eClipNoClipboard);
  258.  
  259. CLOSE
  260.   IF iff # NIL THEN IFF.FreeIFF(iff) END;
  261. END EClip.